"""
@name : 12-8 迭代器与函数
@author : hj
@projectname: CJH
"""
import string
import random
import string
from functools import reduce
from itertools import count
import re

# 生成一个大文件 ， 查找一个文件中最长的行，输出长度
# with open('big.data', 'a+', encoding="utf-8") as f:
#     f.write('aaaaaaaaaaaaaaaaaa\n' * 2)
#     f.write("".join(random.choices(string.ascii_lowercase, k=random.randint(1, 50))) + "\n")
#
# with open('big.data', 'r') as fp:
#     print(max([len(i.strip()) for i in fp.readlines()]))

# 利用map批量检测用户名是否符合规范=> username符合规范, username不符合规范
# • 只能包含数据、字母、下划线，不以数字开头，长度在6-18之间
#  filter把合法的用户名显示出来

# names = ["111", "23eqewq", "Bob", "hejin_1", '_____', 'lalala']
# def f2(n):
#     return re.findall('^[a-zA-Z_][0-9a-zA-Z_]{5,17}$', n)
# print(list(filter(f2, names)))

#  匿名函数+reduce实现 1*2*3*...*n
# n = int(input("请输入你要运算的阶乘数："))
# print(reduce(lambda x, y: x * y, range(1, n + 1)))

#  filter函数:找出[1-100]能被3整除的数
# print(list(filter(lambda x: x % 3 == 0, range(1, 100))))

#  map函数:求list[1-10]各项的平方
# print(list(map(lambda x: x * x, list(range(1, 11)))))

#  将列表[1,4,5,9] 转换成 '1459'的字符串
# print(reduce(lambda x, y: str(x) + str(y), [1, 4, 5, 9]))
# print("".join(map(str, [1, 4, 5, 9])))


# 有以下列表：list1=[7, -8, 5, 4, 0, -2, -5]
# • 正数在前负数在后
# • 整数从小到大
# • 负数从大到小
list1 = [-1, -8, 5, 4, 7, -2, -5,1, 0, 1]
print(sorted(list1, key=lambda x: (x <= 0, abs(x))))
print(sorted(list1, key = lambda x: max(list1)-x+1 if x <=0 else x))

#  这是一个字符串排序，排序规则：小写<大写<奇数<偶数
# • s = 'asdf234GDSdsf23' #排序:小写-大写-奇数-偶数
# • 原理：先比较元组的第一个值，FALSE

# s = 'asdf234GDSdsf23'
# print("".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x))))
#a -->(False, False,False,'a')
#s -->(False, False, False,'s')
#2 -->(True, True, False,2)
#3 -->(True,False,False,3)
#G -->(False,False, True,"G")
